/**
 * Description:
 * Class Name:CrazyItMap
 * Date:2022/5/24 10:03
 *
 * @author LTisme
 * @version JAVA17
 */
package 疯狂Java讲义.第17章_网络编程._17_3_基于TCP协议的网络编程._17_3_5_记录用户信息;

import java.util.*;

// 通过组合HashMap对象来实现所有用户名和对应输出流的映射关系
public class CrazyItMap<K, V>{
    // 创建一个线程安全的HashMap
    public Map<K, V> map = Collections.synchronizedMap(new HashMap<>());
    // 根据value来删除指定项
    public synchronized void removeByValue(Object value){
        for (var key :
                map.keySet()) {
            if (map.get(key) == value || map.get(key).equals(value)) {
                map.remove(key);
                break;
            }
        }
    }
    // 获取所有value组成的Set集合
    public synchronized Set<V> valueSet(){
        Set<V> result = new HashSet<>();
        // 将map中所有value添加到result集合中
        map.forEach((key, value) -> {result.add(value);});
        return result;
    }
    // 根据value查找key
    public synchronized K getKeyByValue(V val){
        // 遍历所有key组成的集合
        for (var key :
                map.keySet()) {
            if (map.get(key) == val || map.get(key).equals(val)) {
                return key;
            }
        }
        return null;
    }
    // 实现put()方法，该方法不允许value重复
    public synchronized V put(K key, V value){
        // 遍历所有value组成的集合
        for (var val :
                valueSet()) {
            // 如果某个value与试图放入集合的value相同
            // 则抛出一个RuntimeException异常
            if (val.equals(value) && val.hashCode() == value.hashCode()){
                throw new RuntimeException("CrazyItMap 实例中不允许有重复 value ！");
            }
        }
        return map.put(key, value);
    }
}
